#!/usr/bin/env python
# -*- coding:utf-8 -*-

# file:do_exam1.py
# author:王雯雯
# datetime:2024-11-12 
# software: PyCharm
import pandas as pd
import matplotlib.pyplot as plt
from collections import defaultdict


# 1. 数据读取与初步查看
def read_data(file_path):
    try:
        data = pd.read_csv(file_path)
        print('数据基本信息：')
        data.info()
        print('数据前几行：')
        print(data.head())
        return data
    except FileNotFoundError:
        print(f"文件 {file_path} 未找到。")
        return None


# 2. 数据清洗：处理缺失值（这里简单地填充为默认值）
def handle_missing_values(data):
    # 假设数值型字段用均值填充，字符串型字段用最常见的值填充
    for col in data.columns:
        if data[col].dtype in ['int64', 'float64']:
            data[col].fillna(data[col].mean(), inplace=True)
        elif data[col].dtype == 'object':
            data[col].fillna(data[col].mode()[0], inplace=True)
    return data


# 3. 对用户年龄进行分层
def age_binning(age):
    if age < 18:
        return '青少年'
    elif 18 <= age < 30:
        return '青年'
    elif 30 <= age < 45:
        return '中年'
    elif age >= 45:
        return '老年'
    else:
        return '未知'


# 4. 将表示位替换为相应的中文
def replace_flags(data):
    flag_mapping = {0: '否', 1: '是'}
    for col in ['是否为新用户', '是否浏览过主页', '是否访问过列表页', '是否访问过产品页', '是否访问过支付结算页', '是否付费']:
        data[col] = data[col].map(flag_mapping)
    return data


# 5. 统计并绘制饼图
def plot_pie_chart(data, column, title):
    counts = data[column].value_counts()
    plt.figure(figsize=(6, 6))
    plt.pie(counts, labels=counts.index, autopct='%1.1f%%')
    plt.title(title)
    plt.show()


# 6. 新老用户付费比例对比分析
def compare_payment_ratio(data):
    new_users = data[data['是否为新用户'] == '是']
    old_users = data[data['是否为新用户'] == '否']
    new_payment_ratio = new_users['是否付费'].value_counts(normalize=True)
    old_payment_ratio = old_users['是否付费'].value_counts(normalize=True)
    print("新用户付费比例：")
    print(new_payment_ratio)
    print("老用户付费比例：")
    print(old_payment_ratio)


# 7. 各年龄段的用户行为和付费情况统计分析
def analyze_age_behavior(data):
    age_groups = data['年龄层'].unique()
    for age_group in age_groups:
        group_data = data[data['年龄层'] == age_group]
        print(f"年龄层: {age_group}")
        print("浏览过主页的比例: ", group_data['是否浏览过主页'].mean())
        print("访问过列表页的比例: ", group_data['是否访问过列表页'].mean())
        print("访问过产品页的比例: ", group_data['是否访问过产品页'].mean())
        print("访问过支付结算页的比例: ", group_data['是否访问过支付结算页'].mean())
        print("付费比例: ", group_data['是否付费'].mean())


# 8. 不同设备用户的活跃度和付费情况统计分析
def analyze_device_behavior(data):
    devices = data['设备'].unique()
    for device in devices:
        device_data = data[data['设备'] == device]
        print(f"设备: {device}")
        print("浏览过主页的比例: ", device_data['是否浏览过主页'].mean())
        print("访问过列表页的比例: ", device_data['是否访问过列表页'].mean())
        print("访问过产品页的比例: ", device_data['是否访问过产品页'].mean())
        print("访问过支付结算页的比例: ", device_data['是否访问过支付结算页'].mean())
        print("付费比例: ", device_data['是否付费'].mean())


# 9. 不同操作系统用户的活跃度和付费情况统计
def analyze_os_behavior(data):
    os_list = data['操作系统'].unique()
    for os in os_list:
        os_data = data[data['操作系统'] == os]
        print(f"操作系统: {os}")
        print("浏览过主页的比例: ", os_data['是否浏览过主页'].mean())
        print("访问过列表页的比例: ", os_data['是否访问过列表页'].mean())
        print("访问过产品页的比例: ", os_data['是否访问过产品页'].mean())
        print("访问过支付结算页的比例: ", os_data['是否访问过支付结算页'].mean())
        print("付费比例: ", os_data['是否付费'].mean())


# 10. 用户来源分析（增加对渠道的营销策略优化）
def analyze_source(data):
    source_counts = data['来源'].value_counts()
    print("不同来源的用户数量:")
    print(source_counts)

    # 分析不同来源的新老用户分布
    source_new_old = defaultdict(lambda: {'新用户': 0, '老用户': 0})
    for _, row in data.iterrows():
        source = row['来源']
        is_new = row['是否为新用户']
        if is_new == '是':
            source_new_old[source]['新用户'] += 1
        else:
            source_new_old[source]['老用户'] += 1

    print("\n不同来源的新老用户分布:")
    for source, counts in source_new_old.items():
        print(f"来源: {source}, 新用户: {counts['新用户']}, 老用户: {counts['老用户']}")

    # 基于来源的营销策略优化示例（简单输出建议）
    for source, counts in source_counts.items():
        if counts > 1000:  # 假设用户数量大于1000的来源是重要来源
            print(f"对于来源 {source}, 可以考虑加大广告投放或提供专属优惠。")
        else:
            print(f"对于来源 {source}, 可以尝试与相关社区合作或进行精准推广。")


# 11. 用户行为路径漏斗图绘制
def plot_funnel(data):
    stages = ['浏览过主页', '浏览过列表页', '浏览过产品页', '浏览过支付结算页', '已付费']
    counts = [data[col].sum() for col in stages]
    conversion_rates = [counts[i] / counts[i - 1] if i > 0 else 1 for i in range(len(counts))]

    plt.figure(figsize=(10, 6))
    plt.bar(stages, counts)
    for i, v in enumerate(counts):
        plt.text(i, v, f"{v:.0f}", ha='center')
    plt.xticks(rotation=45)
    plt.ylabel('用户数量')
    plt.title('用户行为路径漏斗图')
    plt.show()

    print("各阶段转化率：")
    for i, rate in enumerate(conversion_rates):
        print(f"{stages[i]} 到 {stages[i + 1] if i < len(stages) - 1 else '完成'}: {rate * 100:.2f}%")


# 12. 探究用户在不同市场级别下的影响因素
def analyze_market_level(data):
    market_level_counts = data['市场级别'].value_counts()
    print("不同市场级别的用户数对比：")
    print(market_level_counts)

    new_old_by_market = data.groupby(['市场级别', '是否为新用户']).size().unstack()
    print("不同市场级别下的新老用户数量：")
    print(new_old_by_market)


# 主函数
def main():
    file_path = '/mnt/用户行为分析.csv'  # 请替换为实际的文件路径
    data = read_data(file_path)
    if data is not None:
        # 数据清洗
        data = handle_missing_values(data)

        # 对用户年龄进行分层
        data['年龄层'] = data['用户年龄'].apply(age_binning)

        # 将表示位替换为相应的中文
        data = replace_flags(data)

        # 统计并绘制饼图
        for column, title in [('是否为新用户', '新老用户分布'),
                              ('年龄层', '年龄层分布'),
                              ('性别', '性别分布'),
                              ('市场级别', '市场级别分布'),
                              ('设备', '设备分布'),
                              ('操作系统', '操作系统分布'),
                              ('来源', '来源分布')]:
            plot_pie_chart(data, column, title)

        # 新老用户付费比例对比分析
        compare_payment_ratio(data)

        # 各年龄段的用户行为和付费情况统计分析
        analyze_age_behavior(data)

        # 不同设备用户的活跃度和付费情况统计分析
        analyze_device_behavior(data)

        # 不同操作系统用户的活跃度和付费情况统计
        analyze_os_behavior(data)

        # 用户来源分析
        analyze_source(data)

        # 用户行为路径漏斗图绘制
        plot_funnel(data)

        # 探究用户在不同市场级别下的影响因素
        analyze_market_level(data)